package com.trace.demo.repository;

import com.trace.demo.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 产品信息数据访问接口
 */
@Repository
public interface ProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {

    /**
     * 根据批次ID查找产品
     */
    Optional<Product> findByBatchId(String batchId);

    /**
     * 根据批次号查找产品
     */
    Optional<Product> findByBatchNumber(String batchNumber);

    /**
     * 根据农户ID查找产品列表
     */
    List<Product> findByFarmerId(Long farmerId);

    /**
     * 根据农户ID统计产品数量
     */
    long countByFarmerId(Long farmerId);

    /**
     * 根据类别统计产品数量
     * @return 各类别产品数量
     */
    @Query(value = "SELECT category as name, COUNT(*) as value FROM products GROUP BY category", nativeQuery = true)
    List<Map<String, Object>> countByCategories();

    /**
     * 统计今日新增产品数
     * @param startOfToday 今天开始时间
     * @param endOfToday 今天结束时间
     * @return 今日新增产品数
     */
    @Query(value = "SELECT COUNT(*) FROM products WHERE created_at BETWEEN ?1 AND ?2", nativeQuery = true)
    long countTodayNewProducts(LocalDateTime startOfToday, LocalDateTime endOfToday);

    /**
     * 统计总产品数量
     */
    @Query("SELECT COUNT(p) FROM Product p")
    long countProducts();

    /**
     * 根据产品编码前缀查找产品列表
     * @param productCodePrefix 产品编码前缀
     * @return 符合前缀的产品列表
     */
    List<Product> findByProductCodeStartingWith(String productCodePrefix);

    /**
     *
     * 根据农户ID统计最近一个月的产品数量
     * @param id 农户ID
     * @param startOfMonth 月份开始时间
     * @return 产品数量
     */
    Long countByFarmerIdAndCreatedAtAfter(Long id, LocalDateTime startOfMonth);

    /**
     * 根据农户ID查询产品类别分布
     * @param id 农户ID
     * @return 类别分布数据
     */
    @Query(value = "SELECT category as name, COUNT(*) as value FROM products WHERE farmer_id = :id GROUP BY category", nativeQuery = true)
    List<Map<String, Object>> findCategoryDistributionByFarmerId(@Param("id") Long id);
}
